/*
 *所有关于Bus_合同分拆确认类的业务代码应在此处编写
*可使用repository.调用常用方法，获取EF/Dapper等信息
*如果需要事务请使用repository.DbContextBeginTransaction
*也可使用DBServerProvider.手动获取数据库相关信息
*用户信息、权限、角色等使用UserContext.Current操作
*Bus_合同分拆确认Service对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
*/
using VOL.Core.BaseProvider;
using VOL.Core.Extensions.AutofacManager;
using VOL.Entity.DomainModels;
using System.Linq;
using VOL.Core.Utilities;
using System.Linq.Expressions;
using VOL.Core.Extensions;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;
using VOL.Order.IRepositories;
using System.Collections.Generic;
using VOL.Core.ManageUser;
using System;
using Quartz.Util;
using VOL.Core.DBManager;
using VOL.Entity.dtomodel;
using Mapster;
using Newtonsoft.Json;

namespace VOL.Order.Services
{
    public partial class Bus_合同分拆确认Service
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly IBus_合同分拆确认Repository _repository;//访问数据库
        private readonly IDic_班组字典Repository _dic班组字典Repository;

        [ActivatorUtilitiesConstructor]
        public Bus_合同分拆确认Service(
            IBus_合同分拆确认Repository dbRepository,
            IHttpContextAccessor httpContextAccessor,
            IDic_班组字典Repository dic班组字典Repository
            )
        : base(dbRepository)
        {
            _httpContextAccessor = httpContextAccessor;
            _repository = dbRepository;
            //多租户会用到这init代码，其他情况可以不用
            //base.Init(dbRepository);
            _dic班组字典Repository = dic班组字典Repository;
        }

        public List<Bus_合同分拆确认> GetBanZuBaoGongList(Bus_合同分拆确认 bus)
        {
            string 班组长 = UserContext.Current.UserName;
            
            var dic = _dic班组字典Repository.FindFirst(it => it.组长 == 班组长);

            if (dic != null)
            {

        string sql = $@"select distinct 分拆guid,分拆组号,分拆编号,项目经理,分拆类型,总包合同项目名称,任务名称,作业地点,交代事项,单位,工作开始时间,工作结束时间,定额类型,定额名称
                                    from Bus_合同分拆确认
                                    where 1=1 ";

                if (string.IsNullOrWhiteSpace(bus.工期类型) == false)
                {
                    sql += $" and 工期类型 = '{bus.工期类型}'";
                }
                
                if (string.IsNullOrWhiteSpace(bus.总包合同项目名称) == false)
                {
                    sql += $" and 总包合同项目名称 like '%{bus.总包合同项目名称}%'";
                }
                if (string.IsNullOrWhiteSpace(bus.任务名称) == false)
                {
                    sql += $" and 任务名称 like '%{bus.任务名称}%'";
                }

                if (bus.工作开始时间 != null)
                {
                    sql += $" and 工作开始时间 >= '{bus.工作开始时间}'";
                }

                if (bus.工作结束时间 != null)
                {
                    sql += $" and 工作结束时间 <= '{bus.工作结束时间}'";
                }
                sql += $" and 班组 = '{dic.班组}' ";
                sql += " and 分拆状态 <> '已完工'";
                var bus合同分拆sS = DBServerProvider.SqlDapper.QueryList<Bus_合同分拆确认DTO>(sql, null);
                List<Bus_合同分拆确认> bus合同分拆s = bus合同分拆sS.Adapt<List<Bus_合同分拆确认>>();
                //var queryable = repository.FindAsIQueryable(it => it.班组 == dic.班组 && it.分拆状态 == "已派工");
                //if (string.IsNullOrWhiteSpace(bus.总包合同项目名称) == false)
                //{
                //    queryable.Where(it => it.总包合同项目名称.Contains(bus.总包合同项目名称));
                //}
                //if (bus.工作开始时间 != null)
                //{
                //    queryable.Where(it => it.工作开始时间 >= bus.工作开始时间);
                //}

                //if (bus.工作结束时间 != null)
                //{
                //    queryable.Where(it => it.工作结束时间 <= bus.工作结束时间);
                //}

                //List<Bus_合同分拆确认> bus合同分拆s = queryable.OrderBy(it => it.CreateDate).ToList();
                return bus合同分拆s;
            }
            else
            {
                VOL.Core.Services.Logger.Info($"2根据自己班组获取班组任务,报错:没有找到班组");
                //throw new Exception("没有找到班组");
                return null;
            }
        }
        public List<Bus_合同分拆确认> GetBaoGongListByCode(Bus_合同分拆确认 bus)
        {
            List<Bus_合同分拆确认> bus合同分拆s = _repository.Find(it => it.分拆编号 == bus.分拆编号);
            return bus合同分拆s;
        }

        public List<Bus_合同分拆确认> GetBanZuYiBaoGongList(Bus_合同分拆确认 bus)
        {
            string 班组长 = UserContext.Current.UserName;

            var dic = _dic班组字典Repository.FindFirst(it => it.组长 == 班组长);

            if (dic != null)
            {

                string sql = $@"select distinct 分拆guid,分拆组号,分拆编号,项目经理,分拆类型,总包合同项目名称,任务名称,作业地点,交代事项,单位,工作开始时间,工作结束时间,定额类型,定额名称
                                    from Bus_合同分拆确认
                                    where 1=1 ";

                if (string.IsNullOrWhiteSpace(bus.工期类型) == false)
                {
                    sql += $" and 工期类型 = '{bus.工期类型}'";
                }

                if (string.IsNullOrWhiteSpace(bus.总包合同项目名称) == false)
                {
                    sql += $" and 总包合同项目名称 like '%{bus.总包合同项目名称}%'";
                }
                if (string.IsNullOrWhiteSpace(bus.任务名称) == false)
                {
                    sql += $" and 任务名称 like '%{bus.任务名称}%'";
                }

                if (bus.工作开始时间 != null)
                {
                    sql += $" and 工作开始时间 >= '{bus.工作开始时间}'";
                }

                if (bus.工作结束时间 != null)
                {
                    sql += $" and 工作结束时间 <= '{bus.工作结束时间}'";
                }
                sql += $" and 班组 = '{dic.班组}' ";
                sql += " and 分拆状态 <> '已派工'";
                var bus合同分拆sS = DBServerProvider.SqlDapper.QueryList<Bus_合同分拆确认DTO>(sql, null);
                List<Bus_合同分拆确认> bus合同分拆s = bus合同分拆sS.Adapt<List<Bus_合同分拆确认>>();
                return bus合同分拆s;
            }
            else
            {
                VOL.Core.Services.Logger.Info($"2根据自己班组获取班组已报工任务,报错:没有找到班组");
                //throw new Exception("没有找到班组");
                return null;
            }
        }

    }
}
